package com.holystone.orca.util;

import java.io.UnsupportedEncodingException;

public class ChangeCharsetUtil {
	/** 7位ASCII字符，也叫作ISO646-US、Unicode字符集的基本拉丁块 */
	public static final String US_ASCII = "US-ASCII";
	/** ISO 拉丁字母表 No.1，也叫作 ISO-LATIN-1 */
	public static final String ISO_8859_1 = "ISO-8859-1";
	/** 8 位 UCS 转换格式 */
	public static final String UTF_8 = "UTF-8";
	/** 16 位 UCS 转换格式，Big Endian（最低地址存放高位字节）字节顺序 */
	public static final String UTF_16BE = "UTF-16BE";
	/** 16 位 UCS 转换格式，Little-endian（最高地址存放低位字节）字节顺序 */
	public static final String UTF_16LE = "UTF-16LE";
	/** 16 位 UCS 转换格式，字节顺序由可选的字节顺序标记来标识 */
	public static final String UTF_16 = "UTF-16";
	/** 中文超大字符集 */
	public static final String GBK = "GBK";

	/**
	 * 字符串编码转换的实现方法
	 * @param str 待转换编码的字符串
	 * @param newCharset 目标编码
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String changeCharset(String str, String newCharset)
			throws UnsupportedEncodingException {
		if (str != null) {
			//用默认字符编码解码字符串。
			byte[] bs = str.getBytes(getEncode(str));
			//用新的字符编码生成字符串
			return new String(bs, newCharset);
		}
		return null;
	}

	/**
	 * 字符串编码转换的实现方法
	 * @param str 待转换编码的字符串
	 * @param oldCharset 原编码
	 * @param newCharset 目标编码
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public String changeCharset(String str, String oldCharset, String newCharset)
			throws UnsupportedEncodingException {
		if (str != null) {
			//用旧的字符编码解码字符串。解码可能会出现异常。
			byte[] bs = str.getBytes(oldCharset);
			//用新的字符编码生成字符串
			return new String(bs, newCharset);
		}
		return null;
	}

	/**
	 * 将字符编码转换成GBK码
	 */
	public String toGBK(String str) throws UnsupportedEncodingException {
		return changeCharset(str, GBK);
	}
	/**
	 * 将字符编码转换成UTF-8码
	 */
	public static String toUTF_8(String str) throws UnsupportedEncodingException {
		return changeCharset(str, UTF_8);
	}
	//返回编码格式
    private static String getEncode(String str) {
        String encode = null;
        if (verifyEncode(str, GBK)) {
            encode = GBK;
        } else if (verifyEncode(str, ISO_8859_1)) {
            encode = ISO_8859_1;
        } else if (verifyEncode(str, UTF_8)) {
            encode = UTF_8;
        } else if (verifyEncode(str, US_ASCII)) {
            encode = US_ASCII;
        } else if (verifyEncode(str, UTF_16BE)) {
            encode = UTF_16BE;
        } else if (verifyEncode(str, UTF_16LE)) {
            encode = UTF_16LE;
        }else if (verifyEncode(str, UTF_16)) {
            encode = UTF_16;
        }else{
        	encode = System.getProperty("file.encoding");
        }
        return encode;
    }
	//判断编码格式是否相符
    private static boolean verifyEncode(String str, String encode) {
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return true;
            }
        } catch (UnsupportedEncodingException e) {
        	e.printStackTrace();
        }
        return false;
    }
}
